// 验证整个表单
// ruleForm格式为{字段名：字段值}
// rules格式为{字段名：[{规则名：规则值}, {规则名：规则值}...]}

import validateField from "./validateField" // 导入验证单个字段的函数

/**
 * 验证整个表单
 * @param {Object} ruleForm 表单数据
 * @param {Object} rules 验证规则
 * @returns {Object} 错误信息对象
 */
export default function validate(inputRuleForm, inputRrules) {
    const ruleForm = Object.assign({}, inputRuleForm) // 防止修改原对象
    const rules = Object.assign({}, inputRrules) // 防止修改原对象

    // 参数校验，ruleForm和rules不能为空
    if (!ruleForm || !rules) return new Error("ruleForm或rules参数不能为空")

    const ruleFormKeys = Object.keys(ruleForm) // 表单中的字段名
    const rulesKeys = Object.keys(rules) // 规则中的字段名

    // 校验字段是否存在
    const diffKeys = ruleFormKeys.filter(key => !rulesKeys.includes(key)) // 表单中存在但规则中不存在的字段
    if (diffKeys.length > 0) return new Error(`ruleForm中存在${diffKeys.join(",")}字段，但rules中不存在`) // 存在不一致的字段，返回错误信息

    const validData = {} // 错误信息对象

    // 遍历规则，校验每个字段
    for (let key in rules) {
        validData[key] = []
        rules[key].forEach(rule => {
            const message = validateField(ruleForm[key], rule) // 调用validateField方法校验每个字段
            validData[key].push(message) // 将错误信息添加到错误信息对象中
            if (message) validData['valid'] = false // 错误信息为字符串，则置为false
        })
    }

    if (!validData.hasOwnProperty('valid')) validData['valid'] = true // 未出现错误信息，则置为true

    return validData // 返回错误信息对象
}
